home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / gnu / smaltalk.lha / smalltalk-1.1.1 / stix / XPacket.st < prev   
Text File  |  1991-09-12  |  10KB  |  486 lines

  1. "======================================================================
  2. |
  3. | Copyright (C) 1990, 1991 Free Software Foundation, Inc.
  4. | Written by Steve Byrne.
  5. |
  6. | This file is part of GNU Smalltalk.
  7. |
  8. | GNU Smalltalk is free software; you can redistribute it and/or modify it
  9. | under the terms of the GNU General Public License as published by the Free
  10. | Software Foundation; either version 1, or (at your option) any later version.
  11. | GNU Smalltalk is distributed in the hope that it will be useful, but WITHOUT
  12. | ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
  13. | FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
  14. | details.
  15. | You should have received a copy of the GNU General Public License along with
  16. | GNU Smalltalk; see the file COPYING.  If not, write to the Free Software
  17. | Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  
  18. |
  19.  ======================================================================"
  20.  
  21.  
  22. "
  23. |     Change Log
  24. | ============================================================================
  25. | Author       Date       Change 
  26. | sbyrne     24 May 90      created.
  27. |
  28. "
  29.  
  30. Object subclass: #XPacket
  31.        instanceVariableNames: 'stream pos values'
  32.        classVariableNames: 'EventNames PointerEventNames DeviceEventNames
  33.                             KeyButMaskNames KeyMaskNames WinGravityNames
  34.                             BitGravityNames'
  35.        poolDictionaries: ''
  36.        category: 'X hacking'
  37. !
  38.  
  39. XPacket subclass: #XWindowAttrPacket
  40.     instanceVariableNames: ''
  41.     classVariableNames: ''
  42.     poolDictionaries: ''
  43.     category: 'X window attributes'
  44. !
  45.  
  46. XPacket subclass: #XConfigPacket
  47.     instanceVariableNames: ''
  48.     classVariableNames: ''
  49.     poolDictionaries: ''
  50.     category: 'X window configuration'
  51. !
  52.  
  53. XPacket subclass: #XGCAttrPacket
  54.     instanceVariableNames: ''
  55.     classVariableNames: ''
  56.     poolDictionaries: ''
  57.     category: 'X graphic context attributes'
  58. !
  59.  
  60.  
  61. Smalltalk at: #ShowPacket put: false!
  62.  
  63.  
  64. !XPacket class methodsFor: 'instance creation'!
  65.  
  66. command: aByte
  67.     ^self command: aByte aux: 0
  68. !
  69.  
  70. command: aByte aux: aByte2
  71.     ^(self new) init: aByte aux: aByte2
  72. !
  73.  
  74. initialize
  75.     EventNames _ #(KeyPress KeyRelease ButtonPress ButtonRelease EnterWindow
  76.                LeaveWindow PointerMotion PointerMotionHint
  77.                Button1Motion Button2Motion Button3Motion Button4Motion
  78.                Button5Motion ButtonMotion KeymapState Exposure
  79.                VisibilityChange StructureNotify ResizeRedirect
  80.                SubstructureNotify SubstructureRedirect FocusChange
  81.                PropertyChange ColormapChange OwnerGrabButton).
  82.     PointerEventNames _ EventNames copy.
  83.     self remove: #(KeyPress KeyRelease Exposure
  84.                VisibilityChange StructureNotify ResizeRedirect
  85.                SubstructureNotify SubstructureRedirect FocusChange
  86.                PropertyChange ColormapChange OwnerGrabButton)
  87.      from: PointerEventNames.
  88.     DeviceEventNames _ EventNames copy.
  89.     self remove: #(KeyPress KeyRelease Exposure
  90.                VisibilityChange StructureNotify ResizeRedirect
  91.                SubstructureNotify SubstructureRedirect FocusChange
  92.                PropertyChange ColormapChange OwnerGrabButton)
  93.      from: PointerEventNames.
  94.     DeviceEventNames _ EventNames copy.
  95.     self remove: #(EnterWindow LeaveWindow PointerMotionHint
  96.                KeymapState Exposure
  97.                VisibilityChange StructureNotify ResizeRedirect
  98.                SubstructureNotify SubstructureRedirect FocusChange
  99.                PropertyChange ColormapChange OwnerGrabButton)
  100.      from: DeviceEventNames.
  101.  
  102.     KeyMaskNames _ #(Shift Lock Control Mod1 Mod2 Mod3 Mod4 Mod5).
  103.     KeyButMaskNames _ KeyMaskNames, #(Button1 Button2 Button3 Button4 Button5).
  104.  
  105.     BitGravityNames _ #(Forget NorthWest North NorthEast
  106.                 West Center East SouthWest
  107.                 South SouthEast Static).
  108.     WinGravityNames _ BitGravityNames copy.
  109.     WinGravityNames at: 1 put: #Unmap.
  110. !
  111.  
  112. remove: anArray from: eventNames
  113.     1 to: eventNames size do:
  114.     [ :i | (anArray includes: (eventNames at: i))
  115.            ifTrue: [ eventNames at: i put: nil ] ]
  116. !!
  117.  
  118. XPacket initialize!        "Temp: make sure to do this"
  119.  
  120.  
  121. !XPacket methodsFor: 'accessing'!
  122.  
  123. done
  124.     ^self done: false
  125. !
  126.  
  127. doneWord
  128.     ^self done: true
  129. !
  130.  
  131. done: isWord
  132.     | length |
  133.     self pad.
  134.     values notNil
  135.     ifTrue: [ self emitBitValues: isWord ].
  136.     length _ stream position // 4.
  137.     stream position: 3.
  138.     self word: length.
  139.     ShowPacket ifTrue:
  140.     [ stream contents printNl ].
  141.     ^stream contents    
  142. !
  143.  
  144. emitBitValues: isWord
  145.     | bitMask |
  146.     bitMask _ 0.
  147.     values inject: 1 into: 
  148.     [ :bit :value | value notNil
  149.                 ifTrue: [ bitMask _ bitMask bitOr: bit ].
  150.             bit * 2 ].
  151.     isWord
  152.     ifTrue: [ self uword: bitMask ]
  153.     ifFalse: [ self ulong: bitMask ].
  154.     values do: [ :value | value notNil
  155.                   ifTrue: [ self long: value ] ]
  156. !
  157.  
  158. byte: aByte
  159.     stream nextPut: aByte
  160. !
  161.  
  162. bool: aBool
  163.     aBool            "### May extend this to support #True & #False"
  164.     ifTrue: [ stream nextPut: 1 ]
  165.     ifFasle:[ stream nextPut: 0 ]
  166. !
  167.  
  168. word: aWord
  169.     Bigendian 
  170.     ifTrue: [ stream nextPut: aWord // 256. 
  171.           stream nextPut: (aWord bitAnd: 255) ]
  172.     ifFalse: [ stream nextPut: (aWord bitAnd: 255).
  173.            stream nextPut: aWord // 256 ]
  174. !
  175.  
  176. uword: aWord
  177.     self word: aWord        "hack for now"
  178. !
  179.  
  180. long: aLong
  181.     Bigendian 
  182.     ifTrue: [ self word: aLong // 65536. 
  183.           self word: (aLong bitAnd: 65535) ]
  184.     ifFalse: [ self word: (aLong bitAnd: 65535).
  185.            self word: aLong // 65536 ]
  186. !
  187.  
  188. ulong: aLong
  189.     self long: aLong        "hack for now"
  190. !
  191.  
  192. bytes: byteArray
  193.     stream nextPutAll: byteArray
  194. !
  195.  
  196.  
  197. point: aPoint
  198.     self word: aPoint x.
  199.     self word: aPoint y
  200. !
  201.  
  202. rectangle: aRectangle
  203.     self point: aRectangle origin.
  204.     self point: aRectangle corner
  205. !
  206.  
  207. arc: anArc
  208.     anArc emitTo: self
  209. !
  210.  
  211. pad
  212.     | curPos numBytes |
  213.     curPos _ stream position.
  214.     numBytes _ 4 - (curPos - 1) bitAnd: 3.
  215.  
  216.     stream next: numBytes put: 0 
  217. !!
  218.  
  219. !XWindowAttrPacket methodsFor: 'variable arity requests'!
  220.  
  221.  
  222. backgroundPixmap: aValue
  223.     self at: 1 ulong: (X maybeMap: aValue into: #(None ParentRelative))
  224. !
  225.  
  226. backgroundPixel: aValue
  227.     self at: 2 ulong: aValue
  228. !
  229.  
  230. borderPixmap: aValue
  231.     self at: 3 ulong: (X maybeMap: aValue into: #(CopyFromParent))
  232. !
  233.  
  234. borderPixel: aValue
  235.     self at: 4 ulong: aValue
  236. !
  237.  
  238. bitGravity: aValue
  239.     self at: 5
  240.     self byte: (X map: aValue into: BitGravityNames)
  241. !
  242.  
  243. winGravity: aValue
  244.     self at: 6 byte: (X map: aValue into: WinGravityNames) 
  245. !
  246.  
  247. backingStore: aValue
  248.     self at: 7 byte: (X map: aValue into: #(NotUseful WhenMapped Always))
  249. !
  250.  
  251. backingPlanes: aValue
  252.     self at: 8 ulong: aValue
  253. !
  254.  
  255. backingPixel: aValue
  256.     self at: 9 ulong: aValue
  257. !
  258.  
  259. overrideRedirect: aValue
  260.     self at: 10 bool: aValue
  261. !
  262.  
  263. saveUnder: aValue
  264.     self at: 11 bool: aValue
  265. !
  266.  
  267. eventMask: aValue
  268.     self at: 12 ulong: (self makeBitmask: aValue using: EventNames)
  269. !    
  270.  
  271.  
  272. doNotPropagateMask: aValue
  273.     self at: 13 ulong: (self makeBitmask: aValue using: DeviceEventNames)
  274. !
  275.  
  276. colormap: aValue
  277.     self at: 14 ulong: (X maybeMap: aValue into: #(CopyFromParent))
  278. !
  279.  
  280. cursor: aValue
  281.     self at: 15 ulong: (X maybeMap: aValue into: #(None))
  282. !!
  283.  
  284.  
  285. !XConfigPacket methodsFor: 'variable arity request'!
  286.  
  287. x: aValue
  288.     self at: 1 word: aValue
  289. !
  290.  
  291. y: aValue
  292.     self at: 2 word: aValue
  293. !
  294.  
  295. width: aValue
  296.     self at: 3 uword: aValue
  297. !
  298.  
  299. height: aValue
  300.     self at: 4 uword: aValue
  301. !
  302.  
  303. borderWidth: aValue
  304.     self at: 5 uword: aValue
  305. !
  306.  
  307. sibling: aValue
  308.     self at: 6 ulong: aValue id
  309. !
  310.  
  311. stackMode: aValue
  312.     self at: 7 byte: (X map: aValue into: #(Above Below TopIf BottomIf Opposite))
  313. !!
  314.  
  315.  
  316. !XGCAttrPacket methodsFor: 'variable arity requests'!
  317.  
  318. "GC related requests"
  319.  
  320. function: aValue
  321.     self at: 1 
  322.      byte: (X map: aValue
  323.           into: #(Clear And AndReverse Copy AndInverted
  324.                   NoOp Xor Or Nor Equiv Invert
  325.                   OrReverse CopyInverted OrInverted
  326.                   Nand Set))
  327. !
  328.     
  329. planeMask: aValue
  330.     self at: 2 ulong: aValue
  331. !
  332.  
  333. foreground: aValue
  334.     self at: 3 ulong: aValue
  335. !
  336.  
  337. background: aValue
  338.     self at: 4 ulong: aValue
  339. !
  340.  
  341. lineWidth: aValue
  342.     self at: 5 uword: aValue
  343. !
  344.  
  345. lineStyle: aValue
  346.     self at: 6 byte: (X map: aValue into: #(Solid OnOffDash DoubleDash))
  347. !
  348.  
  349. capStyle: aValue
  350.     self at: 7 byte: (X map: aValue into: #(NotLast Butt Round Projecting))
  351. !
  352.  
  353. joinStyle: aValue
  354.     self at: 8 byte: (X map: aValue into: #(Miter Round Bevel))
  355. !
  356.  
  357. fillStyle: aValue
  358.     self at: 9 byte: (X map: aValue into: #(Solid Tiled Stippled OpaqueStippled))
  359. !
  360.  
  361. fillRule: aValue
  362.     self at: 10 byte: (X map: aValue into: #(NotLast Butt Round Projecting))
  363. !
  364.  
  365. tile: aValue
  366.     self at: 11 ulong: aValue id
  367. !
  368.  
  369. stipple: aValue
  370.     self at: 12 ulong: aValue id
  371. !
  372.  
  373. tileStippleXOrigin: aValue
  374.     self at: 13 word: aValue
  375. !
  376.  
  377. tileStippleYOrigin: aValue
  378.     self at: 14 word: aValue
  379. !
  380.  
  381. font: aValue
  382.     self at: 15 ulong: aValue id
  383. !
  384.  
  385. subwindowMode: aValue
  386.     self at: 16 byte: (X map: aValue into: #(ClipByChildren IncludeInferiors))
  387. !
  388.  
  389. graphicsExposures: aValue
  390.     self at: 17 bool: aValue
  391. !
  392.  
  393. clipXOrigin: aValue
  394.     self at: 18 word: aValue
  395. !
  396.  
  397. clipYOrigin: aValue
  398.     self at: 19 word: aValue
  399. !
  400.  
  401.  
  402. clipMask: aValue
  403.     self at: 20 ulong: (X maybeMap: aValue into: #(None))
  404. !
  405.  
  406. dashOffset: aValue
  407.     self at: 21 uword: aValue
  408. !
  409.  
  410. dashes: aValue
  411.     self at: 22 ubyte: aValue
  412. !
  413.  
  414. arcMode: aValue
  415.     self at: 23 byte: (X map: aValue into: #(Chord PieSlice))
  416. !!
  417.  
  418.  
  419. !XPacket methodsFor: 'variable arity support'!
  420.  
  421.  
  422. at: index byte: aValue
  423.     ^self at: index long: aValue
  424. !
  425.  
  426. at: index bool: aValue
  427.     ^self at: index 
  428.       long: [ aValue ifTrue: [ 1 ] ifFalse: [ 0 ] ]
  429. !
  430.  
  431. at: index ubyte: aValue
  432.     ^self at: index long: aValue
  433. !
  434.  
  435. at: index word: aValue
  436.     ^self at: index long: aValue
  437. !
  438.  
  439. at: index uword: aValue
  440.     ^self at: index long: aValue
  441. !
  442.  
  443. at: index ulong: aValue
  444.     ^self at: index long: aValue
  445. !
  446.  
  447. at: index long: aValue
  448.     values isNil ifTrue: [ values _ Array new: 32 ]. "large enough"
  449.     values at: index put: aValue
  450. !
  451.  
  452.  
  453. noBits
  454.     values _ Array new: 32
  455. !
  456.  
  457. makeBitmask: symArray using: nameArray
  458.     | bits | 
  459.     bits _ 0.
  460.     symArray do: [ :sym | bits _ bits bitOr: 
  461.                   (1 bitShift: (X map: sym into: nameArray)) ].
  462.     ^bits
  463. ! !
  464.  
  465.     
  466.  
  467. !XPacket methodsFor: 'writing'!
  468.  
  469. textItem: aTextItem
  470.     aTextItem emitTo: self
  471. !!
  472.  
  473.  
  474.  
  475. !XPacket methodsFor: 'private'!
  476.  
  477. init: aByte aux: aByte2
  478.     stream _ ReadWriteStream on: (ByteArray new: 0).
  479.     self byte: aByte.
  480.     self byte: aByte2.
  481.     self word: 0        "placeholder for length"
  482. !!
  483.  
  484.